package com.kotlin.demo.泛型

/**
 * 动态参数:就是可以传入多个参数
 */

class KtBase107<T>(vararg objects: T, var isMap: Boolean) {

    // out 我们的T 只能被读取,不能被修改
    var objectArray: Array<out T> = objects

    fun showObjs(): Array<out T>? = objectArray.takeIf { true }

    //展示单个类型
    fun showObj(index: Int): Any = objectArray[index].takeIf { isMap } ?: "jdlksjfjs"

    // 类型转换
    fun <O> map(index: Int, mapAction: (T?) -> O) = mapAction(objectArray[index].takeIf { isMap })

    fun <O> map1(index: Int, mapAction: (T?) -> O) {
        mapAction(objectArray[index].takeIf { isMap })
    }
}

fun main() {

    val p: KtBase107<Any?> = KtBase107("zaz", 23, 34.5, 'c', null, 45.6f, isMap = true)
    // Any 虽然可以代表 所有类 但是不能代表nul
    val p1: KtBase107<Any> = KtBase107("zaz", 23, 34.5, 'c', 45.6f, isMap = true)

    println(p.showObj(0))
    println(p.showObj(1))
    println(p.showObj(2))
    println(p.showObj(3))
    println(p.showObj(4))

    println(p.map(0) {
        it.toString()
    })

    /**
     * 能够自动推断出类型来
     */
    val p3 : KtBase107<String> = KtBase107("aaa", "bbb", "ccc", isMap = true)
    println(p3.map(0) {
        it.toString()
    })



}
